日期差值

题目 日期差值

image-3d1b5e27

思路分析

可以直接按之前的思路 从一段长度里面找合法日期数量 累加一下就是相差的天数

但是对于这里来说 时间效率太低了 会超时

#include<bits/stdc++.h>
using namespace std;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int Start,End;

bool check_date(int year,int month,int day)
{
    if(month==0 || month>12)
        return false;
    if(day==0 || day>31)
        return false;
    int curdays=days[month];
    if(month==2)
        if(year%100 && year%4==0 || year%400==0)
            curdays++;
    if(day>curdays)
        return false;
    return true;
}

int main()
{
    while(cin>>Start>>End){
        if(Start>End)
            swap(Start,End);
        int cnt=0;
        for(int date=Start;date<=End;date++){
            int year=date/10000,month=date%10000/100,day=date%100;
            if(check_date(year,month,day)){
                cnt++;
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}
image-3d4b143a

类似于前缀和

image-27614fe9

通过计算两个日期分别距离一个固定日期(例如公元1年1月1日)的总天数,然后计算这两个天数之间的差值来得到日期差

此外,还需要考虑闰年对2月天数的影响

代码实现

#include<bits/stdc++.h>
using namespace std;

int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 计算从公元1年1月1日到指定日期的总天数
int daysFromStart(int year, int month, int day) {
    int totalDays = 0;
    // 添加之前年份的天数
    for(int y = 1; y < year; y++) {
        totalDays += isLeapYear(y) ? 366 : 365;
    }
    // 添加当前年份的月份天数
    for(int m = 1; m < month; m++) {
        totalDays += days[m];
        if(m == 2 && isLeapYear(year)) {
            totalDays++;
        }
    }
    // 添加当前月份的天数
    totalDays += day;

    return totalDays;
}

int main() {
    int startDate, endDate;
    while(cin >> startDate >> endDate) {
        if(startDate>endDate)
            swap(startDate,endDate);
        int startYear=startDate/10000,startMonth=startDate%10000/100,startDay=startDate%100;
        int endYear=endDate/10000,endMonth=endDate%10000/100,endDay=endDate%100;

        int dateDiff=daysFromStart(endYear,endMonth,endDay) - daysFromStart(startYear,startMonth,startDay) + 1;
        cout << dateDiff << endl;
    }
    return 0;
}

//读入可以写成
/*
    while (~scanf("%04d%02d%02d\n%04d%02d%02d", &y1, &m1, &d1, &y2, &m2, &d2))
        printf("%d\n", abs(daysFromStart(y1, m1, d1) - daysFromStart(y2, m2, d2)) + 1);
*/

同类题型

视频讲解


⬅️ 回文日期2 🏠 00-刷题理模型 ➡️ 日期计算